/*
    路由校验思路：
        1.判断该路由是否需要守卫：
            1.1 不需要：可以进入 next()
            1.2 需要：判断是否有token
                1.2.1 没有：跳回登录页
                1.2.3 有：判断token是否正确和是否过期
                    1.2.3.1 token验证通过：next()
                    1.2.3.2 token验证不通过:跳回登录页 (token是错的；过期；又是错的又是过期的)
*/

/* 
    前置路由钩子函数：
    to ：即将要进入的目标路由对象
    from ：当前导航正要离开的路由对象
    next : 调用该方法，进入目标路由

    尽量去路由表配置元信息：meta: {
                            ischeck: false, //不需要路由守卫；
                         }
    //meta元信息名字固定，里面键值对随意；
*/

//实现路由拦截  ，在main.js，引入；
import router from "./router";
import { getToken } from "./utils/auth.js";
import usersApi from "./api/userApi.js";

router.beforeEach((to, from, next) => {
  // 判断进入的页面是否需要守卫
  if (to.meta.ischeck !== false) {
    //需要守卫(鉴权/权限校验)
    let token = getToken(); //不存在为undefined
    //判断是否有token
    if (token) {
      //有token，发请求验证token
      usersApi.checkToken(token).then((res) => {
        //   token是否有效
        if (res.data.code) {
          // token检验通过
          next();
        } else {
          // token校验不通过：跳转登录页重新登录(登录页不需要守卫；可以直接跳)【注】push是router身上的方法
          router.push("/login");
        }
      });
    } else {
      //没有token,跳回登录页;
      router.push("/login");
    }
  } else {
    //不需要守卫
    next();
  }
});
